3ddb79bdLX_P6iB7ILiblRLWvebapg xen/common/dom0_ops.c
3e6377e4i0c9GtKN65e99OtRbw3AZw xen/common/dom_mem_ops.c
3ddb79bdYO5D8Av12NHqPeSviav7cg xen/common/domain.c
+40f2b4a27xPOh3R6zD4M_aabz-TDyg xen/common/elf.c
3fba5b96H0khoxNiKbjdi0inpXV-Pw xen/common/event_channel.c
3ddb79bd9drcFPVxd4w2GPOIjLlXpA xen/common/kernel.c
3e4cd9d8LAAghUY0hNIK72uc2ch_Nw xen/common/keyhandler.c
3ddb79c3r9-31dIsewPV3P3i8HALsQ xen/include/asm-x86/delay.h
3ddb79c34BFiXjBJ_cCKB0aCsV1IDw xen/include/asm-x86/desc.h
40715b2dTokMLYGSuD58BnxOqyWVew xen/include/asm-x86/div64.h
+40f2b4a2hC3HtChu-ArD8LyojxWMjg xen/include/asm-x86/domain.h
3e20b82fl1jmQiKdLy7fxMcutfpjWA xen/include/asm-x86/domain_page.h
3ddb79c3NU8Zy40OTrq3D-i30Y3t4A xen/include/asm-x86/fixmap.h
3e2d29944GI24gf7vOP_7x8EyuqxeA xen/include/asm-x86/flushtlb.h
40589969nPq3DMzv24RDb5LXE9brHw xen/include/xen/sched-if.h
3ddb79c0LzqqS0LhAQ50ekgj4oGl7Q xen/include/xen/sched.h
403a06a7H0hpHcKpAiDe5BPnaXWTlA xen/include/xen/serial.h
-40e3392dib7GrcBAu5cT-EUZTYzeEQ xen/include/xen/shadow.h
3ddb79c14dXIhP7C2ahnoD08K90G_w xen/include/xen/slab.h
3ddb79c09xbS-xxfKxuV3JETIhBzmg xen/include/xen/smp.h
3ddb79c1Vi5VleJAOKHAlY0G2zAsgw xen/include/xen/softirq.h
#include <asm/pdb.h>
#include <xen/trace.h>
#include <xen/console.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <hypervisor-ifs/sched_ctl.h>
#define TRC_DOM0OP_ENTER_BASE 0x00020000
+/******************************************************************************
+ * arch/x86/domain.c
+ *
+ * x86-specific domain handling (e.g., register setup and context switching).
+ */
+
/*
* Copyright (C) 1995 Linus Torvalds
*
#include <asm/ldt.h>
#include <xen/irq.h>
#include <xen/event.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <xen/console.h>
-
#include <xen/elf.h>
-extern int loadelfimage(char *);
-extern int readelfimage_base_and_size(char *, unsigned long,
- unsigned long *, unsigned long *, unsigned long *);
-
#if !defined(CONFIG_X86_64BITMODE)
/* No ring-3 access in initial page tables. */
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
#define round_pgup(_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK)
#define round_pgdown(_p) ((_p)&PAGE_MASK)
-
int hlt_counter;
void disable_hlt(void)
machine_restart(0);
}
-/* this belongs in include/asm, but there doesn't seem to be a suitable place */
-void free_perdomain_pt(struct domain *d)
-{
- free_page((unsigned long)d->mm.perdomain_pt);
-}
-
void arch_do_createdomain(struct domain *d)
{
d->shared_info = (void *)get_free_page();
write_ptbase(¤t->mm);
/* Exit shadow mode before deconstructing final guest page table. */
- if ( shadow_mode(d) )
- shadow_mode_disable(d);
+ shadow_mode_disable(d);
/* Drop the in-use reference to the page-table base. */
if ( pagetable_val(d->mm.pagetable) != 0 )
put_page_and_type(&frame_table[pagetable_val(d->mm.pagetable) >>
PAGE_SHIFT]);
+ /*
+ * Relinquish GDT mappings. No need for explicit unmapping of the LDT as
+ * it automatically gets squashed when the guest's mappings go away.
+ */
+ destroy_gdt(d);
+
/* Relinquish Xen-heap pages. Currently this can only be 'shared_info'. */
page = virt_to_page(d->shared_info);
if ( test_and_clear_bit(_PGC_allocated, &page->count_and_flags) )
#include <xen/errno.h>
#include <xen/perfc.h>
#include <xen/irq.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <asm/page.h>
#include <asm/flushtlb.h>
#include <asm/io.h>
#include <xen/config.h>
#include <xen/types.h>
#include <xen/mm.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <asm/domain_page.h>
#include <asm/page.h>
#include <xen/event.h>
return -ENOMEM;
}
-void shadow_mode_disable( struct domain *p )
+void __shadow_mode_disable(struct domain *d)
{
- struct mm_struct *m = &p->mm;
+ struct mm_struct *m = &d->mm;
struct shadow_status *next;
- __free_shadow_table( m );
+ __free_shadow_table(m);
m->shadow_mode = 0;
SH_LOG("freed tables count=%d l1=%d l2=%d",
- m->shadow_page_count, perfc_value(shadow_l1_pages), perfc_value(shadow_l2_pages));
+ m->shadow_page_count, perfc_value(shadow_l1_pages),
+ perfc_value(shadow_l2_pages));
next = m->shadow_ht_extras;
- while( next )
+ while ( next )
{
struct shadow_status * this = next;
m->shadow_extras_count--;
next = *((struct shadow_status **)(&next[shadow_ht_extra_size]));
- kfree( this );
+ kfree(this);
}
SH_LOG("freed extras, now %d", m->shadow_extras_count);
- if( m->shadow_dirty_bitmap )
+ if ( m->shadow_dirty_bitmap )
{
kfree( m->shadow_dirty_bitmap );
m->shadow_dirty_bitmap = 0;
return rc;
}
-int shadow_mode_control( struct domain *p, dom0_shadow_control_t *sc )
+int shadow_mode_control(struct domain *d, dom0_shadow_control_t *sc)
{
unsigned int cmd = sc->op;
int rc = 0;
- spin_lock(&p->mm.shadow_lock);
+ spin_lock(&d->mm.shadow_lock);
- if ( p->mm.shadow_mode && cmd == DOM0_SHADOW_CONTROL_OP_OFF )
+ if ( cmd == DOM0_SHADOW_CONTROL_OP_OFF )
{
- shadow_mode_disable(p);
+ shadow_mode_disable(d);
}
else if ( cmd == DOM0_SHADOW_CONTROL_OP_ENABLE_TEST )
{
- if(p->mm.shadow_mode) shadow_mode_disable(p);
- shadow_mode_enable(p, SHM_test);
+ shadow_mode_disable(d);
+ shadow_mode_enable(d, SHM_test);
}
else if ( cmd == DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY )
{
- if(p->mm.shadow_mode) shadow_mode_disable(p);
- shadow_mode_enable(p, SHM_logdirty);
+ shadow_mode_disable(d);
+ shadow_mode_enable(d, SHM_logdirty);
}
- else if ( p->mm.shadow_mode && cmd >= DOM0_SHADOW_CONTROL_OP_FLUSH && cmd<=DOM0_SHADOW_CONTROL_OP_CLEAN2 )
+ else if ( shadow_mode(d) &&
+ (cmd >= DOM0_SHADOW_CONTROL_OP_FLUSH) &&
+ (cmd <= DOM0_SHADOW_CONTROL_OP_CLEAN2) )
{
- rc = shadow_mode_table_op(p, sc);
+ rc = shadow_mode_table_op(d, sc);
}
else
{
rc = -EINVAL;
}
- flush_tlb_cpu(p->processor);
+ flush_tlb_cpu(d->processor);
- spin_unlock(&p->mm.shadow_lock);
+ spin_unlock(&d->mm.shadow_lock);
return rc;
}
-
-
-static inline struct pfn_info *alloc_shadow_page( struct mm_struct *m )
+static inline struct pfn_info *alloc_shadow_page(struct mm_struct *m)
{
m->shadow_page_count++;
-
- return alloc_domain_page( NULL );
+ return alloc_domain_page(NULL);
}
-
void unshadow_table( unsigned long gpfn, unsigned int type )
{
unsigned long spfn;
#include <xen/spinlock.h>
#include <xen/irq.h>
#include <xen/perfc.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <asm/domain_page.h>
#include <asm/system.h>
#include <asm/io.h>
}
-long set_gdt(struct domain *p,
+void destroy_gdt(struct domain *d)
+{
+ int i;
+ unsigned long pfn;
+
+ for ( i = 0; i < 16; i++ )
+ {
+ if ( (pfn = l1_pgentry_to_pagenr(d->mm.perdomain_pt[i])) != 0 )
+ put_page_and_type(&frame_table[pfn]);
+ d->mm.perdomain_pt[i] = mk_l1_pgentry(0);
+ }
+}
+
+
+long set_gdt(struct domain *d,
unsigned long *frames,
unsigned int entries)
{
/* NB. There are 512 8-byte entries per GDT page. */
int i, nr_pages = (entries + 511) / 512;
- unsigned long pfn;
struct desc_struct *vgdt;
/* Check the new GDT. */
{
if ( unlikely(frames[i] >= max_page) ||
unlikely(!get_page_and_type(&frame_table[frames[i]],
- p, PGT_gdt_page)) )
+ d, PGT_gdt_page)) )
goto fail;
}
unmap_domain_mem(vgdt);
/* Tear down the old GDT. */
- for ( i = 0; i < 16; i++ )
- {
- if ( (pfn = l1_pgentry_to_pagenr(p->mm.perdomain_pt[i])) != 0 )
- put_page_and_type(&frame_table[pfn]);
- p->mm.perdomain_pt[i] = mk_l1_pgentry(0);
- }
+ destroy_gdt(d);
/* Install the new GDT. */
for ( i = 0; i < nr_pages; i++ )
- p->mm.perdomain_pt[i] =
+ d->mm.perdomain_pt[i] =
mk_l1_pgentry((frames[i] << PAGE_SHIFT) | __PAGE_HYPERVISOR);
- SET_GDT_ADDRESS(p, GDT_VIRT_START);
- SET_GDT_ENTRIES(p, (entries*8)-1);
+ SET_GDT_ADDRESS(d, GDT_VIRT_START);
+ SET_GDT_ENTRIES(d, (entries*8)-1);
return 0;
#include <asm/pdb.h>
#include <xen/trace.h>
#include <xen/console.h>
-#include <xen/shadow.h>
+#include <asm/shadow.h>
#include <hypervisor-ifs/sched_ctl.h>
#define TRC_DOM0OP_ENTER_BASE 0x00020000
+/******************************************************************************
+ * domain.c
+ *
+ * Generic domain-handling functions.
+ */
#include <xen/config.h>
#include <xen/init.h>
#include <xen/event.h>
#include <xen/time.h>
#include <xen/console.h>
-#include <xen/shadow.h>
-#include <xen/elf.h>
+#include <asm/shadow.h>
#include <hypervisor-ifs/dom0_ops.h>
#include <asm/hardirq.h>
#include <asm/domain_page.h>
struct domain *task_hash[TASK_HASH_SIZE];
struct domain *task_list;
-extern void arch_do_createdomain(struct domain *);
-extern void arch_final_setup_guestos(struct domain *, full_execution_context_t *c);
-extern void free_perdomain_pt(struct domain *);
-extern void domain_relinquish_memory(struct domain *d);
-
struct domain *do_createdomain(domid_t dom_id, unsigned int cpu)
{
char buf[100];
set_bit(DF_CONSTRUCTED, &p->flags);
out:
- if (c) kfree(c);
-
+ if ( c != NULL )
+ kfree(c);
return rc;
}
-
-static inline int is_loadable_phdr(Elf_Phdr *phdr)
-{
- return ((phdr->p_type == PT_LOAD) &&
- ((phdr->p_flags & (PF_W|PF_X)) != 0));
-}
-
-int readelfimage_base_and_size(char *elfbase,
- unsigned long elfsize,
- unsigned long *pkernstart,
- unsigned long *pkernend,
- unsigned long *pkernentry)
-{
- Elf_Ehdr *ehdr = (Elf_Ehdr *)elfbase;
- Elf_Phdr *phdr;
- Elf_Shdr *shdr;
- unsigned long kernstart = ~0UL, kernend=0UL;
- char *shstrtab, *guestinfo;
- int h;
-
- if ( !IS_ELF(*ehdr) )
- {
- printk("Kernel image does not have an ELF header.\n");
- return -EINVAL;
- }
-
- if ( (ehdr->e_phoff + (ehdr->e_phnum * ehdr->e_phentsize)) > elfsize )
- {
- printk("ELF program headers extend beyond end of image.\n");
- return -EINVAL;
- }
-
- if ( (ehdr->e_shoff + (ehdr->e_shnum * ehdr->e_shentsize)) > elfsize )
- {
- printk("ELF section headers extend beyond end of image.\n");
- return -EINVAL;
- }
-
- /* Find the section-header strings table. */
- if ( ehdr->e_shstrndx == SHN_UNDEF )
- {
- printk("ELF image has no section-header strings table (shstrtab).\n");
- return -EINVAL;
- }
- shdr = (Elf_Shdr *)(elfbase + ehdr->e_shoff +
- (ehdr->e_shstrndx*ehdr->e_shentsize));
- shstrtab = elfbase + shdr->sh_offset;
-
- /* Find the special '__xen_guest' section and check its contents. */
- for ( h = 0; h < ehdr->e_shnum; h++ )
- {
- shdr = (Elf_Shdr *)(elfbase + ehdr->e_shoff + (h*ehdr->e_shentsize));
- if ( strcmp(&shstrtab[shdr->sh_name], "__xen_guest") != 0 )
- continue;
- guestinfo = elfbase + shdr->sh_offset;
- printk("Xen-ELF header found: '%s'\n", guestinfo);
- if ( (strstr(guestinfo, "GUEST_OS=linux") == NULL) ||
- (strstr(guestinfo, "XEN_VER=1.3") == NULL) )
- {
- printk("ERROR: Xen will only load Linux built for Xen v1.3\n");
- return -EINVAL;
- }
- break;
- }
- if ( h == ehdr->e_shnum )
- {
- printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
- return -EINVAL;
- }
-
- for ( h = 0; h < ehdr->e_phnum; h++ )
- {
- phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
- if ( !is_loadable_phdr(phdr) )
- continue;
- if ( phdr->p_vaddr < kernstart )
- kernstart = phdr->p_vaddr;
- if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
- kernend = phdr->p_vaddr + phdr->p_memsz;
- }
-
- if ( (kernstart > kernend) ||
- (ehdr->e_entry < kernstart) ||
- (ehdr->e_entry > kernend) )
- {
- printk("Malformed ELF image.\n");
- return -EINVAL;
- }
-
- *pkernstart = kernstart;
- *pkernend = kernend;
- *pkernentry = ehdr->e_entry;
-
- return 0;
-}
-
-int loadelfimage(char *elfbase)
-{
- Elf_Ehdr *ehdr = (Elf_Ehdr *)elfbase;
- Elf_Phdr *phdr;
- int h;
-
- for ( h = 0; h < ehdr->e_phnum; h++ )
- {
- phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
- if ( !is_loadable_phdr(phdr) )
- continue;
- if ( phdr->p_filesz != 0 )
- memcpy((char *)phdr->p_vaddr, elfbase + phdr->p_offset,
- phdr->p_filesz);
- if ( phdr->p_memsz > phdr->p_filesz )
- memset((char *)phdr->p_vaddr + phdr->p_filesz, 0,
- phdr->p_memsz - phdr->p_filesz);
- }
-
- return 0;
-}
--- /dev/null
+/******************************************************************************
+ * elf.c
+ *
+ * Generic Elf-loading routines.
+ */
+
+#include <xen/config.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/mm.h>
+#include <xen/elf.h>
+
+static inline int is_loadable_phdr(Elf_Phdr *phdr)
+{
+ return ((phdr->p_type == PT_LOAD) &&
+ ((phdr->p_flags & (PF_W|PF_X)) != 0));
+}
+
+int readelfimage_base_and_size(char *elfbase,
+ unsigned long elfsize,
+ unsigned long *pkernstart,
+ unsigned long *pkernend,
+ unsigned long *pkernentry)
+{
+ Elf_Ehdr *ehdr = (Elf_Ehdr *)elfbase;
+ Elf_Phdr *phdr;
+ Elf_Shdr *shdr;
+ unsigned long kernstart = ~0UL, kernend=0UL;
+ char *shstrtab, *guestinfo;
+ int h;
+
+ if ( !IS_ELF(*ehdr) )
+ {
+ printk("Kernel image does not have an ELF header.\n");
+ return -EINVAL;
+ }
+
+ if ( (ehdr->e_phoff + (ehdr->e_phnum * ehdr->e_phentsize)) > elfsize )
+ {
+ printk("ELF program headers extend beyond end of image.\n");
+ return -EINVAL;
+ }
+
+ if ( (ehdr->e_shoff + (ehdr->e_shnum * ehdr->e_shentsize)) > elfsize )
+ {
+ printk("ELF section headers extend beyond end of image.\n");
+ return -EINVAL;
+ }
+
+ /* Find the section-header strings table. */
+ if ( ehdr->e_shstrndx == SHN_UNDEF )
+ {
+ printk("ELF image has no section-header strings table (shstrtab).\n");
+ return -EINVAL;
+ }
+ shdr = (Elf_Shdr *)(elfbase + ehdr->e_shoff +
+ (ehdr->e_shstrndx*ehdr->e_shentsize));
+ shstrtab = elfbase + shdr->sh_offset;
+
+ /* Find the special '__xen_guest' section and check its contents. */
+ for ( h = 0; h < ehdr->e_shnum; h++ )
+ {
+ shdr = (Elf_Shdr *)(elfbase + ehdr->e_shoff + (h*ehdr->e_shentsize));
+ if ( strcmp(&shstrtab[shdr->sh_name], "__xen_guest") != 0 )
+ continue;
+ guestinfo = elfbase + shdr->sh_offset;
+ printk("Xen-ELF header found: '%s'\n", guestinfo);
+ if ( (strstr(guestinfo, "GUEST_OS=linux") == NULL) ||
+ (strstr(guestinfo, "XEN_VER=1.3") == NULL) )
+ {
+ printk("ERROR: Xen will only load Linux built for Xen v1.3\n");
+ return -EINVAL;
+ }
+ break;
+ }
+ if ( h == ehdr->e_shnum )
+ {
+ printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
+ return -EINVAL;
+ }
+
+ for ( h = 0; h < ehdr->e_phnum; h++ )
+ {
+ phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
+ if ( !is_loadable_phdr(phdr) )
+ continue;
+ if ( phdr->p_vaddr < kernstart )
+ kernstart = phdr->p_vaddr;
+ if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
+ kernend = phdr->p_vaddr + phdr->p_memsz;
+ }
+
+ if ( (kernstart > kernend) ||
+ (ehdr->e_entry < kernstart) ||
+ (ehdr->e_entry > kernend) )
+ {
+ printk("Malformed ELF image.\n");
+ return -EINVAL;
+ }
+
+ *pkernstart = kernstart;
+ *pkernend = kernend;
+ *pkernentry = ehdr->e_entry;
+
+ return 0;
+}
+
+int loadelfimage(char *elfbase)
+{
+ Elf_Ehdr *ehdr = (Elf_Ehdr *)elfbase;
+ Elf_Phdr *phdr;
+ int h;
+
+ for ( h = 0; h < ehdr->e_phnum; h++ )
+ {
+ phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
+ if ( !is_loadable_phdr(phdr) )
+ continue;
+ if ( phdr->p_filesz != 0 )
+ memcpy((char *)phdr->p_vaddr, elfbase + phdr->p_offset,
+ phdr->p_filesz);
+ if ( phdr->p_memsz > phdr->p_filesz )
+ memset((char *)phdr->p_vaddr + phdr->p_filesz, 0,
+ phdr->p_memsz - phdr->p_filesz);
+ }
+
+ return 0;
+}
#include <xen/compile.h>
#include <xen/console.h>
#include <xen/serial.h>
-#include <xen/shadow.h>
#include <xen/trace.h>
+#include <asm/shadow.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/domain_page.h>
--- /dev/null
+
+#ifndef __ASM_X86_DOMAIN_H__
+#define __ASM_X86_DOMAIN_H__
+
+extern void arch_do_createdomain(struct domain *d);
+
+extern void arch_final_setup_guestos(
+ struct domain *d, full_execution_context_t *c);
+
+static inline void free_perdomain_pt(struct domain *d)
+{
+ free_page((unsigned long)d->mm.perdomain_pt);
+}
+
+extern void domain_relinquish_memory(struct domain *d);
+
+#endif /* __ASM_X86_DOMAIN_H__ */
#define __ASM_X86_MM_H__
#include <xen/config.h>
-#ifdef LINUX_2_6
-#include <xen/gfp.h>
-#endif
#include <xen/list.h>
#include <xen/spinlock.h>
#include <xen/perfc.h>
#include <hypervisor-ifs/hypervisor-if.h>
-/*
- * The following is for page_alloc.c.
- */
-
-void init_page_allocator(unsigned long min, unsigned long max);
-unsigned long __get_free_pages(int order);
-void __free_pages(unsigned long p, int order);
-#define get_free_page() (__get_free_pages(0))
-#define __get_free_page() (__get_free_pages(0))
-#define free_pages(_p,_o) (__free_pages(_p,_o))
-#define free_page(_p) (__free_pages(_p,0))
-
-
/*
* Per-page-frame information.
*/
#define GET_GDT_ENTRIES(_p) ((*(u16 *)((_p)->mm.gdt + 0)))
#define GET_GDT_ADDRESS(_p) ((*(unsigned long *)((_p)->mm.gdt + 2)))
-long set_gdt(struct domain *p,
+void destroy_gdt(struct domain *d);
+long set_gdt(struct domain *d,
unsigned long *frames,
unsigned int entries);
#define shadow_linear_pg_table ((l1_pgentry_t *)SH_LINEAR_PT_VIRT_START)
#define shadow_linear_l2_table ((l2_pgentry_t *)(SH_LINEAR_PT_VIRT_START+(SH_LINEAR_PT_VIRT_START>>(L2_PAGETABLE_SHIFT-L1_PAGETABLE_SHIFT))))
+#define shadow_mode(_d) ((_d)->mm.shadow_mode)
+#define shadow_lock_init(_d) spin_lock_init(&(_d)->mm.shadow_lock)
+
extern void shadow_mode_init(void);
-extern int shadow_mode_control( struct domain *p, dom0_shadow_control_t *sc );
-extern int shadow_fault( unsigned long va, long error_code );
-extern void shadow_l1_normal_pt_update( unsigned long pa, unsigned long gpte,
- unsigned long *prev_spfn_ptr,
- l1_pgentry_t **prev_spl1e_ptr );
-extern void shadow_l2_normal_pt_update( unsigned long pa, unsigned long gpte );
-extern void unshadow_table( unsigned long gpfn, unsigned int type );
-extern int shadow_mode_enable( struct domain *p, unsigned int mode );
-extern void shadow_mode_disable( struct domain *p );
+extern int shadow_mode_control(struct domain *p, dom0_shadow_control_t *sc);
+extern int shadow_fault(unsigned long va, long error_code);
+extern void shadow_l1_normal_pt_update(unsigned long pa, unsigned long gpte,
+ unsigned long *prev_spfn_ptr,
+ l1_pgentry_t **prev_spl1e_ptr);
+extern void shadow_l2_normal_pt_update(unsigned long pa, unsigned long gpte);
+extern void unshadow_table(unsigned long gpfn, unsigned int type);
+extern int shadow_mode_enable(struct domain *p, unsigned int mode);
+
+extern void __shadow_mode_disable(struct domain *d);
+static inline void shadow_mode_disable(struct domain *d)
+{
+ if ( shadow_mode(d) )
+ __shadow_mode_disable(d);
+}
+
extern unsigned long shadow_l2_table(
struct mm_struct *m, unsigned long gpfn );
#endif
-/************************************************************************/
-
-#define shadow_mode(d) (d->mm.shadow_mode)
-#define shadow_lock_init(d) spin_lock_init(&d->mm.shadow_lock)
-
/************************************************************************/
static inline int __mark_dirty( struct mm_struct *m, unsigned int mfn )
ASSERT(m->shadow_dirty_bitmap);
if( likely(pfn<m->shadow_dirty_bitmap_size) )
{
- /* These updates occur with mm.shadow_lock held, so use
- (__) version of test_and_set */
- if( __test_and_set_bit( pfn, m->shadow_dirty_bitmap ) == 0 )
- {
- // if we set it
- m->shadow_dirty_count++;
- rc = 1;
- }
+ /* These updates occur with mm.shadow_lock held, so use
+ (__) version of test_and_set */
+ if ( __test_and_set_bit( pfn, m->shadow_dirty_bitmap ) == 0 )
+ {
+ // if we set it
+ m->shadow_dirty_count++;
+ rc = 1;
+ }
}
else
{
frame_table[mfn].count_and_flags,
frame_table[mfn].type_and_flags );
}
-
+
return rc;
}
/************************************************************************/
-static inline void l1pte_write_fault( struct mm_struct *m,
- unsigned long *gpte_p, unsigned long *spte_p )
+static inline void l1pte_write_fault(
+ struct mm_struct *m, unsigned long *gpte_p, unsigned long *spte_p)
{
unsigned long gpte = *gpte_p;
unsigned long spte = *spte_p;
- switch( m->shadow_mode )
+ switch ( m->shadow_mode )
{
case SHM_test:
spte = gpte;
*spte_p = spte;
}
-static inline void l1pte_read_fault( struct mm_struct *m,
- unsigned long *gpte_p, unsigned long *spte_p )
+static inline void l1pte_read_fault(
+ struct mm_struct *m, unsigned long *gpte_p, unsigned long *spte_p)
{
unsigned long gpte = *gpte_p;
unsigned long spte = *spte_p;
- switch( m->shadow_mode )
+ switch ( m->shadow_mode )
{
case SHM_test:
spte = gpte;
*spte_p = spte;
}
-static inline void l1pte_no_fault( struct mm_struct *m,
- unsigned long *gpte_p, unsigned long *spte_p )
+static inline void l1pte_no_fault(
+ struct mm_struct *m, unsigned long *gpte_p, unsigned long *spte_p)
{
unsigned long gpte = *gpte_p;
unsigned long spte = *spte_p;
- switch( m->shadow_mode )
+ switch ( m->shadow_mode )
{
case SHM_test:
spte = 0;
*spte_p = spte;
}
-static inline void l2pde_general( struct mm_struct *m,
- unsigned long *gpde_p, unsigned long *spde_p,
- unsigned long sl1pfn)
+static inline void l2pde_general(
+ struct mm_struct *m,
+ unsigned long *gpde_p,
+ unsigned long *spde_p,
+ unsigned long sl1pfn)
{
unsigned long gpde = *gpde_p;
unsigned long spde = *spde_p;
/*********************************************************************/
-
-
#if SHADOW_HASH_DEBUG
static void shadow_audit(struct mm_struct *m, int print)
{
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef __XEN_ELF_H__
+#define __XEN_ELF_H__
+
typedef u8 Elf_Byte;
typedef u32 Elf32_Addr; /* Unsigned program address */
#define AuxInfo Aux64Info
#endif
+extern int loadelfimage(char *);
+extern int readelfimage_base_and_size(
+ char *, unsigned long, unsigned long *, unsigned long *, unsigned long *);
+
+#endif /* __XEN_ELF_H__ */
#ifndef __XEN_MM_H__
#define __XEN_MM_H__
+/* page_alloc.c */
+void init_page_allocator(unsigned long min, unsigned long max);
+unsigned long __get_free_pages(int order);
+void __free_pages(unsigned long p, int order);
+#define get_free_page() (__get_free_pages(0))
+#define __get_free_page() (__get_free_pages(0))
+#define free_pages(_p,_o) (__free_pages(_p,_o))
+#define free_page(_p) (__free_pages(_p,0))
+
#include <asm/mm.h>
#endif /* __XEN_MM_H__ */
#define IS_PRIV(_d) (test_bit(DF_PRIVILEGED, &(_d)->flags))
#define IS_CAPABLE_PHYSDEV(_d) (test_bit(DF_PHYSDEV, &(_d)->flags))
+#include <asm/domain.h>
+
#endif /* __SCHED_H__ */
+++ /dev/null
-#include <asm/shadow.h>